#pragma once

#include "AsCoordinate.h"
#include "AsMath.h"
#include "AsAttitudeParam.h"




///***********************************************************************
/// The conversion from matrix to axis and angle.
/// @Author	Xiao Yao
/// @Date	2023.4.2
/// @Input
/// @Param	mtx	    坐标转换矩阵
/// @Output
/// @Param	axis	旋转轴矢量
/// @Param	angle	旋转角[0, pi]
///***********************************************************************
void	AsMtxToAxAng(const CMatrix<double>& mtx, CCoord& axis, double& angle);

///***********************************************************************
///将四元数转化成欧拉角_123转序
/// @Author	Liu Tianqing
/// @Date	2023.04.06
/// @Input
/// @Param	q		标准化四元数
/// @Output
/// @Param	euler	欧拉角
///***********************************************************************
bool	AsQuatToEuler123(const CQuaternion& q, CEuler& euler);

///***********************************************************************
///将四元数转化成欧拉角_213转序
/// @Author	Kong Lingyue
/// @Date	2025.03.10
/// @Input
/// @Param	q		标准化四元数
/// @Output
/// @Param	euler		欧拉角(rad)
///***********************************************************************
bool	AsQuatToEuler213(const CQuaternion& q, CEuler& euler);

///***********************************************************************
/// 方向余弦阵转321转序欧拉角
/// @Author	Li Sibei
/// @Date	2023.04.06
/// @Input
/// @Param	mtx		方向余弦阵
/// @Output
/// @Param	euler	欧拉角
///***********************************************************************
void	AsMtxToEuler321(const CMatrix<double>& mtx, CEuler& euler);

///***********************************************************************
/// 方向余弦矩阵转为313转序Euler角
/// @Author	Wang Weili
/// @Date	2023.4
/// @Input
/// @Param	mtx 坐标转移矩阵
/// @Output
/// @Param	euler 欧拉角
///***********************************************************************
void	AsMtxToEuler313(const CMatrix<double>& mtx, CEuler& euler);

///***********************************************************************
/// 方向余弦矩阵转为312转序Euler角
/// @Author	Zhang Xuaying
/// @Date	2023.04.01
/// @Input  
/// @Param	mtx  		方向余弦矩阵
/// @Output	
/// @Param	euler		欧拉角(rad)
///***********************************************************************
void	AsMtxToEuler312(const CMatrix<double>& mtx, CEuler& euler);

///******************************************************
/// 根据转序和坐标转移矩阵计算Euler角，转序为2-3-1
/// @author Sun Fengyan
/// @data   2023.4
/// @Version    1.0
/// @Input  
/// @Param  mtx       坐标转移矩阵
/// @Output
/// @Param  euler     欧拉角返回值(单位：rad）
///******************************************************
void	AsMtxToEuler231(const CMatrix<double>& mtx, CEuler& euler); 

///***********************************************************************
/// 方向余弦阵转123转序欧拉角
/// @Author	Gong he
/// @Date	2023.04.14
/// @Input
/// @Param	mtx		方向余弦阵
/// @Output
/// @Param	angle	欧拉角
///***********************************************************************
void	AsMtxToEuler123(const CMatrix<double>& mtx, CEuler& euler);

///***********************************************************************
/// 将四元数转换为321转序的欧拉角(Z-Y-X)  
/// 遵循航天器标准定义：偏航角->俯仰角->滚转角  
/// 对应绕惯性系Z轴->新Y轴->新X轴的连续旋转  
/// @Author	王薪程（你们可爱的学长哦~） 
/// @Date	2025-03-03  
/// @Version	3.2.1  
///  
/// @Input  
/// @Param	quat	输入四元数(需标准化，不标准化也无所谓啦），顺序:标量Qs,矢量QxQyQz)  
///  
/// @Output  
/// @Param	euler	输出欧拉角结构体(单位：弧度)  
///			        m_Angle3: 绕X轴滚转角 φ ∈ [-π,π] 
///			        m_Angle2: 绕Y轴俯仰角 θ ∈ [-π/2,π/2]  
///			        m_Angle1: 绕Z轴偏航角 ψ ∈ [-π,π]   
///  
/// @Return	true: 转换成功  false: 四元数未标准化  
///  
/// @算法说明：  
/// 1. 通过四元数导出旋转矩阵关键元素，避免完整矩阵计算  
/// 2. 采用显式代数展开提升计算效率  
/// 3. 奇异位置处理逻辑与AsMtxToEuler321()保持兼容  
/// 4. 数值阈值统一采用工程标准1e-7
///***********************************************************************  
void AsQuatToEuler321(CQuaternion& quat, CEuler& euler);


///***********************************************************************
/// 四元数323转换成Euler角
/// @Author	BXT
/// @Date	2025.3
/// @Input
/// @Param quat		四元数
/// @Output
/// @Param euler	欧拉角
///***********************************************************************
void AsQuatToEuler323(CQuaternion& quat, CEuler& euler);

///***********************************************************************
/// 根据坐标转移矩阵计算132转序欧拉角
/// @Author	Wang Deyu
/// @Date	2025.03.11
/// @Input
/// @Param	mtx     输入的转移矩阵
/// @Output	
/// @Param	euler	欧拉角    rad
///***********************************************************************
void AsMtxToEuler132(const CMatrix<double>& mtx, CEuler& euler);

///***********************************************************************
/// 方向余弦矩阵转为212转序Euler角
/// @Author	Chang Xiaokuan
/// @Date	2025.2.28
/// @Input
/// @Param	mtx		坐标转移矩阵
/// @Output
/// @Param	euler	欧拉角(rad)
///***********************************************************************
void AsMtxToEuler212(const CMatrix<double>& mtx, CEuler& euler);

///***********************************************************************
/// 方向余弦矩阵转为121转序Euler角
/// @Author	Ma  Zihui
/// @Date	2025.3
/// @Input
/// @Param	mtx		坐标转移矩阵
/// @Output
/// @Param	euler	欧拉角(rad)
///***********************************************************************
void AsMtxToEuler121(const CMatrix<double>& mtx, CEuler& euler);

/***********************************************************************
将四元数转化成欧拉角_132转序
 @Author	Xiong yanci
 @Date	2025.02.27
 @Input
 @Param	q		标准化四元数
 @Output
 @Param	euler		欧拉角(rad)
***********************************************************************/
bool AsQuatToEuler132(const CQuaternion& q, CEuler& euler);